package my3;

import java.util.HashSet;
import java.util.Set;

/**
 * 定一个字符串 s ，请你找出其中不含有重复字符的 最长
 * 子串
 *  的长度。
 *
 *
 *
 * 示例 1:
 *
 * 输入: s = "abcabcbb"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
 * 示例 2:
 *
 * 输入: s = "bbbbb"
 * 输出: 1
 * 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
 * 示例 3:
 *
 * 输入: s = "pwwkew"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
 *      请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
 *
 */
public class SuanFa3 {
    public int lengthOfLongestSubstring(String s) {
        int right=0;
        int result = 0;
        int length = s.length();
        //为了不让在集合中的数重复，使用set集合。
        Set<Character> charDemo = new HashSet<Character>();

        for (int left = 0; left < length; left++) {
            //每当一次最外层的for循环开始，都意味着要重新开始一次左边界的变换。
            //所以我呢吧需要将上一次循环中左边界的元素从Set集合中去除，然后选择
            //当前开始的元素为新的左边界，开始循环
            if (left != 0){
                charDemo.remove(s.charAt(left-1));
            }
            //使用滑动窗口可以保证我们最后在窗口也就是左边界和右边界中的元素是连续的
            while (right  < length && !charDemo.contains(s.charAt(right))) {
                // 不断地移动右指针
                charDemo.add(s.charAt(right));
                right++;
            }
            result = Math.max(result,right-left);
        }
      return result;
    }

    public static void main(String[] args) {
        SuanFa3 suanFa3 = new SuanFa3();
        String s = "pwwkew";
        int i = suanFa3.lengthOfLongestSubstring(s);
        System.out.println(i);

    }
}
